package RRHH_Modelo;

import Conexion.Conexion;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class RHH_FECHAS_HITO {

    private int ID;
    private String DESCRIPCION;
    private Date FECHA;
    private Double SALARIO;
    private int ID_USUARIO;
    private String DESCRIPCION_CARGO;
    private int ID_EVENTO_HITO;
    private Conexion con = null;

    public RHH_FECHAS_HITO(Conexion con) {
        this.con = con;
    }

    public RHH_FECHAS_HITO(int ID, String DESCRIPCION, Date FECHA, Double SALARIO, int ID_USUARIO, String DESCRIPCION_CARGO, int ID_EVENTO_HITO) {
        this.ID = ID;
        this.DESCRIPCION = DESCRIPCION;
        this.FECHA = FECHA;
        this.SALARIO = SALARIO;
        this.ID_USUARIO = ID_USUARIO;
        this.DESCRIPCION_CARGO = DESCRIPCION_CARGO;
        this.ID_EVENTO_HITO = ID_EVENTO_HITO;
    }

    public int Insertar() throws SQLException {
        String consulta = "insert into BROKER.RHH_FECHAS_HITO (ID, DESCRIPCION, FECHA, SALARIO, ID_USUARIO, DESCRIPCION_CARGO, ID_EVENTO_HITO) VALUES (" + ID + ",'" + DESCRIPCION + "',to_date('" + getFECHA() + "','dd/MM/yyyy')," + SALARIO + "," + ID_USUARIO + ",'" + DESCRIPCION_CARGO + "'," + ID_EVENTO_HITO + ")";
        con.EjecutarSentencia(consulta);
        consulta = "select BROKER.RHH_FECHAS_HITO_SEQ.currval as ID from dual";
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        return rs.getInt("ID");
    }
    public String stringInsert() throws SQLException {
        String consulta = "insert into BROKER.RHH_FECHAS_HITO (ID, DESCRIPCION, FECHA, SALARIO, ID_USUARIO, DESCRIPCION_CARGO, ID_EVENTO_HITO) VALUES (" + ID + ",'" + DESCRIPCION + "',to_date('" + getFECHA() + "','dd/MM/yyyy')," + SALARIO + "," + ID_USUARIO + ",'" + DESCRIPCION_CARGO + "'," + ID_EVENTO_HITO + ")";
        return consulta;
    }

    public boolean EliminarXid() throws SQLException {
        String consulta = "delete from BROKER.RHH_FECHAS_HITO where ID= " + getID();
        con.EjecutarSentencia(consulta);
        return true;
    }
    public boolean EliminarIncrementoSalarial(int idusuario) throws SQLException {
        String consulta = "delete from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO=8 and ID_USUARIO="+idusuario;
        con.EjecutarSentencia(consulta);
        return true;
    }
    public boolean EliminarDespedido(int idusuario) throws SQLException {
        String consulta = "delete from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO=1 and ID_USUARIO="+idusuario;
        con.EjecutarSentencia(consulta);
        return true;
    }
    public boolean EliminarRenuncia(int idusuario) throws SQLException {
        String consulta = "delete from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO=2 and ID_USUARIO="+idusuario;
        con.EjecutarSentencia(consulta);
        return true;
    }
    public boolean EliminarConclusionServicio(int idusuario) throws SQLException {
        String consulta = "delete from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO=11 and ID_USUARIO="+idusuario;
        con.EjecutarSentencia(consulta);
        return true;
    }
    public boolean EliminarFinalizacionContrato(int idusuario) throws SQLException {
        String consulta = "delete from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO=21 and ID_USUARIO="+idusuario;
        con.EjecutarSentencia(consulta);
        return true;
    }
    public boolean EliminarPromociones(int idusuario) throws SQLException {
        String consulta = "delete from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO=9 and ID_USUARIO="+idusuario;
        con.EjecutarSentencia(consulta);
        return true;
    }
    public boolean EliminarContrato(int idusuario) throws SQLException {
        String consulta = "delete from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO=3 and ID_USUARIO="+idusuario;
        con.EjecutarSentencia(consulta);
        return true;
    }
   
    public double salarioUsuario(int usuario) {
        try {
            
            String consulta = "select SALARIO\n" +
                              " from BROKER.RHH_FECHAS_HITO \n" +
                              " where  id =(select max(id)\n" +
                              " from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO = 9 \n" +
                              " and ID_USUARIO="+usuario+")";
            ResultSet rs = con.EjecutarConsulta(consulta);
            double promocion=0;
            if(rs.next())
                promocion= rs.getDouble("SALARIO");
            
            consulta = "select SALARIO \n" +
                        " from BROKER.RHH_FECHAS_HITO \n" +
                        " where  id =(select max(id)\n" +
                        " from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO = 3 \n" +
                        " and ID_USUARIO="+usuario+")";
            rs = con.EjecutarConsulta(consulta);
            double salarioContratacion=0;
            if(rs.next())
            salarioContratacion= rs.getDouble("SALARIO");
            consulta = "select sum(SALARIO) as SALARIO\n" +
                        " from BROKER.RHH_FECHAS_HITO \n" +
                        " where ID_EVENTO_HITO = 8 \n" +
                        " and ID_USUARIO="+usuario;
            rs = con.EjecutarConsulta(consulta);
            double incremento=0;
            if(rs.next())
            incremento= rs.getDouble("SALARIO");
            if(promocion>0){
                return promocion+incremento;
            }else{
                return salarioContratacion+incremento;
            }
        } catch (SQLException ex) {
            return 0.0;
        }
    }
    
    
    public int CantidadMaxIncrementoSalarial() throws SQLException {
            String consulta = "SELECT MAX(COUNT(RHH_FECHAS_HITO.ID))AS INCREMENTOS\n" +
                                " FROM RHH_FECHAS_HITO, RHH_USUARIO\n" +
                                " WHERE (RHH_FECHAS_HITO.ID_USUARIO = RHH_USUARIO.ID)\n" +
                                " AND (RHH_FECHAS_HITO.ID_EVENTO_HITO = 8)\n" +
                                " GROUP BY RHH_FECHAS_HITO.ID_USUARIO";
            ResultSet rs = con.EjecutarConsulta(consulta);
            if(rs.next())
                return rs.getInt("INCREMENTOS");
            else
                return 0;
    }

    public List<RHH_FECHAS_HITO> Todos() throws SQLException {
        String consulta = "select * from BROKER.RHH_FECHAS_HITO";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_FECHAS_HITO> lista = Cargar(rs);
        return lista;
    }
    public RHH_FECHAS_HITO Buscar(int id) throws SQLException {
        String consulta = "select * from BROKER.RHH_FECHAS_HITO where ID = "+id;
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_FECHAS_HITO> lista = Cargar(rs);
        if(lista.size()>0)
            return lista.get(0);
        else
            return null;
    }
    
    public List<RHH_FECHAS_HITO> Incrementos(int idusuario) throws SQLException {
        String consulta = "SELECT RHH_FECHAS_HITO.*\n" +
                            "  FROM BROKER.RHH_FECHAS_HITO, BROKER.RHH_EVENTOS_HITO\n" +
                            " WHERE     (RHH_FECHAS_HITO.ID_EVENTO_HITO = RHH_EVENTOS_HITO.ID)\n" +
                            "       AND (RHH_EVENTOS_HITO.ID = 8)\n" +
                            "       AND (RHH_FECHAS_HITO.ID_USUARIO = "+idusuario+") ORDER BY RHH_FECHAS_HITO.FECHA";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);
    }
    public RHH_FECHAS_HITO retiro(int idusuario) throws SQLException {
        String consulta = "SELECT RHH_FECHAS_HITO.*\n" +
                            "  FROM BROKER.RHH_FECHAS_HITO, BROKER.RHH_EVENTOS_HITO\n" +
                            " WHERE     (RHH_FECHAS_HITO.ID_EVENTO_HITO = RHH_EVENTOS_HITO.ID)\n" +
                            "       AND ((RHH_EVENTOS_HITO.ID = 1) OR (RHH_EVENTOS_HITO.ID = 2) OR (RHH_EVENTOS_HITO.ID = 21))\n" +
                            "       AND (RHH_FECHAS_HITO.ID_USUARIO = "+idusuario+") ORDER BY RHH_FECHAS_HITO.FECHA";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_FECHAS_HITO> lista= Cargar(rs);
        if (lista.size()>0) 
            return lista.get(0);
        else
            return null;
    }
    
    public RHH_FECHAS_HITO BuscarxEvento(int tipo) throws SQLException {
        String consulta = "select * from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO = "+tipo;
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_FECHAS_HITO> lista = Cargar(rs);
        if(lista.size()>0)
            return lista.get(0);
        else
            return null;
    }
    public RHH_FECHAS_HITO BuscarxUsuarioEvento(int tipo,int id) throws SQLException {
        String consulta = "select * from BROKER.RHH_FECHAS_HITO where ID_EVENTO_HITO = "+tipo+" and ID_USUARIO="+id+" order by ID desc ";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_FECHAS_HITO> lista = Cargar(rs);
        if(lista.size()>0)
            return lista.get(0);
        else
            return null;
    }
    public List<RHH_FECHAS_HITO> historialUsuario(int id,String caracteristica) throws SQLException {
        String consulta = "select * from BROKER.RHH_FECHAS_HITO where ID_USUARIO="+id+" and ID_EVENTO_HITO IN "+caracteristica+" order by FECHA ASC ";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_FECHAS_HITO> lista = Cargar(rs);
        if(lista.size()>0)
            return lista;
        else
            return null;
    }

    public List<RHH_FECHAS_HITO> Retirados(String mes, int ano) throws SQLException 
    {
        String consulta = "SELECT RHH_FECHAS_HITO.*\n" +
                        " FROM BROKER.RHH_USUARIO, BROKER.RHH_FECHAS_HITO, BROKER.RHH_EVENTOS_HITO\n" +
                        " WHERE (RHH_FECHAS_HITO.ID_USUARIO = RHH_USUARIO.ID)\n" +
                        " AND (RHH_FECHAS_HITO.ID_EVENTO_HITO = RHH_EVENTOS_HITO.ID)\n" +
                        " AND (RHH_USUARIO.ESTADO = 2)\n" +
                        " AND (RHH_EVENTOS_HITO.ID IN (1, 2, 21))\n"+
                        " AND to_char(RHH_FECHAS_HITO.FECHA,'MM/yyyy')='"+mes+"/"+ano+"'";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);            
    }

    public List<RHH_FECHAS_HITO> Cargar(ResultSet rs) throws SQLException {
        List<RHH_FECHAS_HITO> lista = new ArrayList<RHH_FECHAS_HITO>();
        while (rs.next()) {
            RHH_FECHAS_HITO objeto = new RHH_FECHAS_HITO(con);
            objeto.setID(rs.getInt("ID"));
            objeto.setDESCRIPCION(rs.getString("DESCRIPCION"));
            objeto.setFECHA(rs.getDate("FECHA"));
            objeto.setSALARIO(rs.getDouble("SALARIO"));
            objeto.setID_USUARIO(rs.getInt("ID_USUARIO"));
            objeto.setDESCRIPCION_CARGO(rs.getString("DESCRIPCION_CARGO"));
            objeto.setID_EVENTO_HITO(rs.getInt("ID_EVENTO_HITO"));
            lista.add(objeto);
        }
        return lista;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getDESCRIPCION() {
        return DESCRIPCION;
    }

    public void setDESCRIPCION(String DESCRIPCION) {
        this.DESCRIPCION = DESCRIPCION;
    }

    public String getFECHA() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        return sdf.format(FECHA);
    }
    public Date getFECHAinDate() {
        if(FECHA!=null)
            return FECHA;
        else
            return null;
    }

    public void setFECHA(Date FECHA) {
        this.FECHA = FECHA;
    }

    public Double getSALARIO() {
        return SALARIO;
    }

    public void setSALARIO(Double SALARIO) {
        this.SALARIO = SALARIO;
    }

    public int getID_USUARIO() {
        return ID_USUARIO;
    }

    public void setID_USUARIO(int ID_USUARIO) {
        this.ID_USUARIO = ID_USUARIO;
    }

    public String getDESCRIPCION_CARGO() {
        return DESCRIPCION_CARGO;
    }

    public void setDESCRIPCION_CARGO(String DESCRIPCION_CARGO) {
        this.DESCRIPCION_CARGO = DESCRIPCION_CARGO;
    }

    public int getID_EVENTO_HITO() {
        return ID_EVENTO_HITO;
    }

    public void setID_EVENTO_HITO(int ID_EVENTO_HITO) {
        this.ID_EVENTO_HITO = ID_EVENTO_HITO;
    }

    public Conexion getCon() {
        return this.con;
    }

    public void setCon(Conexion con) {
        this.con = con;
    }
}
